<!DOCTYPE html>
<html lang=zh>
<head>
  <meta charset="utf-8">
  
  <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
  <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, minimum-scale=1, user-scalable=no, minimal-ui">
  <meta name="renderer" content="webkit">
  <meta http-equiv="Cache-Control" content="no-transform" />
  <meta http-equiv="Cache-Control" content="no-siteapp" />
  <meta name="apple-mobile-web-app-capable" content="yes">
  <meta name="apple-mobile-web-app-status-bar-style" content="black">
  <meta name="format-detection" content="telephone=no,email=no,adress=no">
  <!-- Color theme for statusbar -->
  <meta name="theme-color" content="#000000" />
  <!-- 强制页面在当前窗口以独立页面显示,防止别人在框架里调用页面 -->
  <meta http-equiv="window-target" content="_top" />
  
  
  <title>编程规范 | Skyung-Blog</title>
  <meta name="description" content="编程规范">
<meta property="og:type" content="article">
<meta property="og:title" content="编程规范">
<meta property="og:url" content="https://skyung.gitee.io/Skyung/2022/03/29/%E7%BC%96%E7%A8%8B%E8%A7%84%E8%8C%83/index.html">
<meta property="og:site_name" content="Skyung-Blog">
<meta property="og:description" content="编程规范">
<meta property="og:locale" content="zh_CN">
<meta property="og:image" content="https://zqyhdm-blog.oss-cn-shanghai.aliyuncs.com/markdown/image-20220423144300124.png">
<meta property="og:image" content="https://zqyhdm-blog.oss-cn-shanghai.aliyuncs.com/markdown/image-20220423164034617.png">
<meta property="og:image" content="https://zqyhdm-blog.oss-cn-shanghai.aliyuncs.com/markdown/image-20220423164301935.png">
<meta property="og:image" content="https://zqyhdm-blog.oss-cn-shanghai.aliyuncs.com/markdown/image-20220423201441336.png">
<meta property="og:image" content="https://zqyhdm-blog.oss-cn-shanghai.aliyuncs.com/markdown/image-20220423202156407.png">
<meta property="og:image" content="https://zqyhdm-blog.oss-cn-shanghai.aliyuncs.com/markdown/image-20220424104650459.png">
<meta property="article:published_time" content="2022-03-28T16:00:00.000Z">
<meta property="article:modified_time" content="2022-03-29T16:00:00.000Z">
<meta property="article:author" content="Skyung">
<meta property="article:tag" content="java">
<meta name="twitter:card" content="summary">
<meta name="twitter:image" content="https://zqyhdm-blog.oss-cn-shanghai.aliyuncs.com/markdown/image-20220423144300124.png">
  <!-- Canonical links -->
  <link rel="canonical" href="https://skyung.gitee.io/Skyung/2022/03/29/%E7%BC%96%E7%A8%8B%E8%A7%84%E8%8C%83/index.html">
  
    <link rel="alternate" href="/atom.xml" title="Skyung-Blog" type="application/atom+xml">
  
  
    <link rel="icon" href="images/favicon.png" type="image/x-icon">
  
  
<link rel="stylesheet" href="/Skyung/css/style.css">

  
  
  
  
<meta name="generator" content="Hexo 5.4.1"></head>


<body class="main-center" itemscope itemtype="http://schema.org/WebPage">
  <header class="header" itemscope itemtype="http://schema.org/WPHeader">
  <div class="slimContent">
    <div class="navbar-header">
      
      
      <div class="profile-block text-center">
        <a id="avatar" href="https://github.com/cofess" target="_blank">
          <img class="img-circle img-rotate" src="/Skyung/images/avatar.jpg" width="200" height="200">
        </a>
        <h2 id="name" class="hidden-xs hidden-sm">Skyung</h2>
        <h3 id="title" class="hidden-xs hidden-sm hidden-md">Web Developer</h3>
        <small id="location" class="text-muted hidden-xs hidden-sm"><i class="icon icon-map-marker"></i> Wuhan, China</small>
      </div>
      
      <div class="search" id="search-form-wrap">

    <form class="search-form sidebar-form">
        <div class="input-group">
            <input type="text" class="search-form-input form-control" placeholder="搜索" />
            <span class="input-group-btn">
                <button type="submit" class="search-form-submit btn btn-flat" onclick="return false;"><i class="icon icon-search"></i></button>
            </span>
        </div>
    </form>
    <div class="ins-search">
  <div class="ins-search-mask"></div>
  <div class="ins-search-container">
    <div class="ins-input-wrapper">
      <input type="text" class="ins-search-input" placeholder="想要查找什么..." x-webkit-speech />
      <button type="button" class="close ins-close ins-selectable" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">×</span></button>
    </div>
    <div class="ins-section-wrapper">
      <div class="ins-section-container"></div>
    </div>
  </div>
</div>


</div>
      <button class="navbar-toggle collapsed" type="button" data-toggle="collapse" data-target="#main-navbar" aria-controls="main-navbar" aria-expanded="false">
        <span class="sr-only">Toggle navigation</span>
        <span class="icon-bar"></span>
        <span class="icon-bar"></span>
        <span class="icon-bar"></span>
      </button>
    </div>
    <nav id="main-navbar" class="collapse navbar-collapse" itemscope itemtype="http://schema.org/SiteNavigationElement" role="navigation">
      <ul class="nav navbar-nav main-nav ">
        
        
        <li class="menu-item menu-item-home">
          <a href="/Skyung/.">
            
            <i class="icon icon-home-fill"></i>
            
            <span class="menu-title">首页</span>
          </a>
        </li>
        
        
        <li class="menu-item menu-item-archives">
          <a href="/Skyung/archives">
            
            <i class="icon icon-archives-fill"></i>
            
            <span class="menu-title">归档</span>
          </a>
        </li>
        
        
        <li class="menu-item menu-item-categories">
          <a href="/Skyung/categories">
            
            <i class="icon icon-folder"></i>
            
            <span class="menu-title">分类</span>
          </a>
        </li>
        
        
        <li class="menu-item menu-item-tags">
          <a href="/Skyung/tags">
            
            <i class="icon icon-tags"></i>
            
            <span class="menu-title">标签</span>
          </a>
        </li>
        
        
        <li class="menu-item menu-item-repository">
          <a href="/Skyung/repository">
            
            <i class="icon icon-project"></i>
            
            <span class="menu-title">项目</span>
          </a>
        </li>
        
        
        <li class="menu-item menu-item-books">
          <a href="/Skyung/books">
            
            <i class="icon icon-book-fill"></i>
            
            <span class="menu-title">书单</span>
          </a>
        </li>
        
        
        <li class="menu-item menu-item-links">
          <a href="/Skyung/links">
            
            <i class="icon icon-friendship"></i>
            
            <span class="menu-title">友链</span>
          </a>
        </li>
        
        
        <li class="menu-item menu-item-about">
          <a href="/Skyung/about">
            
            <i class="icon icon-cup-fill"></i>
            
            <span class="menu-title">关于</span>
          </a>
        </li>
        
      </ul>
      
	
    <ul class="social-links">
    	
        <li><a href="/Skyung/null" target="_blank" title="Github" data-toggle=tooltip data-placement=top><i class="icon icon-github"></i></a></li>
        
        <li><a href="/Skyung/null" target="_blank" title="Weibo" data-toggle=tooltip data-placement=top><i class="icon icon-weibo"></i></a></li>
        
        <li><a href="/Skyung/null" target="_blank" title="Twitter" data-toggle=tooltip data-placement=top><i class="icon icon-twitter"></i></a></li>
        
        <li><a href="/Skyung/null" target="_blank" title="Behance" data-toggle=tooltip data-placement=top><i class="icon icon-behance"></i></a></li>
        
        <li><a href="/Skyung/atom.xml" target="_blank" title="Rss" data-toggle=tooltip data-placement=top><i class="icon icon-rss"></i></a></li>
        
    </ul>

    </nav>
  </div>
</header>

  
    <aside class="sidebar" itemscope itemtype="http://schema.org/WPSideBar">
  <div class="slimContent">
    
      <div class="widget">
    <h3 class="widget-title">公告</h3>
    <div class="widget-body">
        <div id="board">
            <div class="content">
                <p>欢迎交流与分享经验!</p>
            </div>
        </div>
    </div>
</div>

    
      
  <div class="widget">
    <h3 class="widget-title">分类</h3>
    <div class="widget-body">
      <ul class="category-list"><li class="category-list-item"><a class="category-list-link" href="/Skyung/categories/%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/">学习笔记</a><span class="category-list-count">20</span></li></ul>
    </div>
  </div>


    
      
  <div class="widget">
    <h3 class="widget-title">标签</h3>
    <div class="widget-body">
      <ul class="tag-list" itemprop="keywords"><li class="tag-list-item"><a class="tag-list-link" href="/Skyung/tags/java/" rel="tag">java</a><span class="tag-list-count">19</span></li><li class="tag-list-item"><a class="tag-list-link" href="/Skyung/tags/jvm/" rel="tag">jvm</a><span class="tag-list-count">1</span></li><li class="tag-list-item"><a class="tag-list-link" href="/Skyung/tags/linux/" rel="tag">linux</a><span class="tag-list-count">1</span></li><li class="tag-list-item"><a class="tag-list-link" href="/Skyung/tags/redis/" rel="tag">redis</a><span class="tag-list-count">1</span></li><li class="tag-list-item"><a class="tag-list-link" href="/Skyung/tags/%E5%A4%9A%E7%BA%BF%E7%A8%8B/" rel="tag">多线程</a><span class="tag-list-count">1</span></li><li class="tag-list-item"><a class="tag-list-link" href="/Skyung/tags/%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B/" rel="tag">并发编程</a><span class="tag-list-count">2</span></li><li class="tag-list-item"><a class="tag-list-link" href="/Skyung/tags/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F/" rel="tag">设计模式</a><span class="tag-list-count">4</span></li><li class="tag-list-item"><a class="tag-list-link" href="/Skyung/tags/%E9%9B%B6%E6%95%A3%E7%82%B9/" rel="tag">零散点</a><span class="tag-list-count">1</span></li></ul>
    </div>
  </div>


    
      
  <div class="widget">
    <h3 class="widget-title">标签云</h3>
    <div class="widget-body tagcloud">
      <a href="/Skyung/tags/java/" style="font-size: 14px;">java</a> <a href="/Skyung/tags/jvm/" style="font-size: 13px;">jvm</a> <a href="/Skyung/tags/linux/" style="font-size: 13px;">linux</a> <a href="/Skyung/tags/redis/" style="font-size: 13px;">redis</a> <a href="/Skyung/tags/%E5%A4%9A%E7%BA%BF%E7%A8%8B/" style="font-size: 13px;">多线程</a> <a href="/Skyung/tags/%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B/" style="font-size: 13.33px;">并发编程</a> <a href="/Skyung/tags/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F/" style="font-size: 13.67px;">设计模式</a> <a href="/Skyung/tags/%E9%9B%B6%E6%95%A3%E7%82%B9/" style="font-size: 13px;">零散点</a>
    </div>
  </div>

    
      
  <div class="widget">
    <h3 class="widget-title">归档</h3>
    <div class="widget-body">
      <ul class="archive-list"><li class="archive-list-item"><a class="archive-list-link" href="/Skyung/archives/2022/05/">五月 2022</a><span class="archive-list-count">5</span></li><li class="archive-list-item"><a class="archive-list-link" href="/Skyung/archives/2022/04/">四月 2022</a><span class="archive-list-count">7</span></li><li class="archive-list-item"><a class="archive-list-link" href="/Skyung/archives/2022/03/">三月 2022</a><span class="archive-list-count">9</span></li><li class="archive-list-item"><a class="archive-list-link" href="/Skyung/archives/2022/02/">二月 2022</a><span class="archive-list-count">1</span></li><li class="archive-list-item"><a class="archive-list-link" href="/Skyung/archives/2021/09/">九月 2021</a><span class="archive-list-count">1</span></li></ul>
    </div>
  </div>


    
      
  <div class="widget">
    <h3 class="widget-title">最新文章</h3>
    <div class="widget-body">
      <ul class="recent-post-list list-unstyled no-thumbnail">
        
          <li>
            
            <div class="item-inner">
              <p class="item-category">
                <a class="category-link" href="/Skyung/categories/%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/">学习笔记</a>
              </p>
              <p class="item-title">
                <a href="/Skyung/2022/05/08/Spring/" class="title">spring</a>
              </p>
              <p class="item-date">
                <time datetime="2022-05-07T16:00:00.000Z" itemprop="datePublished">2022-05-08</time>
              </p>
            </div>
          </li>
          
          <li>
            
            <div class="item-inner">
              <p class="item-category">
                <a class="category-link" href="/Skyung/categories/%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/">学习笔记</a>
              </p>
              <p class="item-title">
                <a href="/Skyung/2022/05/08/netty-RPC/" class="title">Netty-RPC</a>
              </p>
              <p class="item-date">
                <time datetime="2022-05-07T16:00:00.000Z" itemprop="datePublished">2022-05-08</time>
              </p>
            </div>
          </li>
          
          <li>
            
            <div class="item-inner">
              <p class="item-category">
                <a class="category-link" href="/Skyung/categories/%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/">学习笔记</a>
              </p>
              <p class="item-title">
                <a href="/Skyung/2022/05/07/%E5%B8%B8%E7%94%A8%E7%B1%BB%E5%BA%93%E5%92%8CAPI/" class="title">常见类库</a>
              </p>
              <p class="item-date">
                <time datetime="2022-05-06T16:00:00.000Z" itemprop="datePublished">2022-05-07</time>
              </p>
            </div>
          </li>
          
          <li>
            
            <div class="item-inner">
              <p class="item-category">
                <a class="category-link" href="/Skyung/categories/%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/">学习笔记</a>
              </p>
              <p class="item-title">
                <a href="/Skyung/2022/05/07/%E5%8D%95%E5%85%83%E6%B5%8B%E8%AF%95/" class="title">单元测试</a>
              </p>
              <p class="item-date">
                <time datetime="2022-05-06T16:00:00.000Z" itemprop="datePublished">2022-05-07</time>
              </p>
            </div>
          </li>
          
          <li>
            
            <div class="item-inner">
              <p class="item-category">
                <a class="category-link" href="/Skyung/categories/%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/">学习笔记</a>
              </p>
              <p class="item-title">
                <a href="/Skyung/2022/05/01/netty%E8%81%8A%E5%A4%A9%E5%AE%A4/" class="title">Netty聊天室</a>
              </p>
              <p class="item-date">
                <time datetime="2022-04-30T16:00:00.000Z" itemprop="datePublished">2022-05-01</time>
              </p>
            </div>
          </li>
          
      </ul>
    </div>
  </div>
  

    
  </div>
</aside>

  
  
  <aside class="sidebar sidebar-toc collapse   in  " id="collapseToc" itemscope itemtype="http://schema.org/WPSideBar">
  <div class="slimContent">
    <nav id="toc" class="article-toc">
      <h3 class="toc-title">文章目录</h3>
      <ol class="toc"><li class="toc-item toc-level-2"><a class="toc-link" href="#%E4%BB%A3%E7%A0%81%E9%A3%8E%E6%A0%BC"><span class="toc-number">1.</span> <span class="toc-text">代码风格</span></a><ol class="toc-child"><li class="toc-item toc-level-3"><a class="toc-link" href="#%E5%91%BD%E5%90%8D"><span class="toc-number">1.1.</span> <span class="toc-text">命名</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#%E6%B3%A8%E9%87%8A"><span class="toc-number">1.2.</span> <span class="toc-text">注释</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#%E6%A0%BC%E5%BC%8F"><span class="toc-number">1.3.</span> <span class="toc-text">格式</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#%E5%AD%97%E9%9D%A2%E9%87%8F"><span class="toc-number">1.4.</span> <span class="toc-text">字面量</span></a></li></ol></li><li class="toc-item toc-level-2"><a class="toc-link" href="#%E7%BC%96%E7%A8%8B%E5%AE%9E%E8%B7%B5"><span class="toc-number">2.</span> <span class="toc-text">编程实践</span></a><ol class="toc-child"><li class="toc-item toc-level-3"><a class="toc-link" href="#%E7%94%B3%E6%98%8E%E5%92%8C%E5%88%9D%E5%A7%8B%E5%8C%96%E3%80%81%E6%95%B0%E6%8D%AE%E7%B1%BB%E5%9E%8B"><span class="toc-number">2.1.</span> <span class="toc-text">申明和初始化、数据类型</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#%E8%A1%A8%E8%BE%BE%E5%BC%8F%E3%80%81%E6%8E%A7%E5%88%B6%E8%AF%AD%E5%8F%A5%E3%80%81%E6%96%B9%E6%B3%95"><span class="toc-number">2.2.</span> <span class="toc-text">表达式、控制语句、方法</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#%E7%B1%BB%E3%80%81%E6%8E%A5%E5%8F%A3%E3%80%81%E9%9D%A2%E5%90%91%E5%AF%B9%E8%B1%A1"><span class="toc-number">2.3.</span> <span class="toc-text">类、接口、面向对象</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#%E5%BC%82%E5%B8%B8%E5%A4%84%E7%90%86"><span class="toc-number">2.4.</span> <span class="toc-text">异常处理</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#%E5%B9%B6%E5%8F%91%E4%B8%8E%E5%A4%9A%E7%BA%BF%E7%A8%8B"><span class="toc-number">2.5.</span> <span class="toc-text">并发与多线程</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#%E6%B3%9B%E5%9E%8B%E5%92%8C%E9%9B%86%E5%90%88"><span class="toc-number">2.6.</span> <span class="toc-text">泛型和集合</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#%E8%BE%93%E5%85%A5%E8%BE%93%E5%87%BA"><span class="toc-number">2.7.</span> <span class="toc-text">输入输出</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#%E5%BA%8F%E5%88%97%E5%8C%96"><span class="toc-number">2.8.</span> <span class="toc-text">序列化</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#%E5%A4%96%E9%83%A8%E6%95%B0%E6%8D%AE%E6%A0%A1%E9%AA%8C"><span class="toc-number">2.9.</span> <span class="toc-text">外部数据校验</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#%E6%97%A5%E5%BF%97"><span class="toc-number">2.10.</span> <span class="toc-text">日志</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#%E6%80%A7%E8%83%BD%E5%92%8C%E8%B5%84%E6%BA%90%E7%AE%A1%E7%90%86"><span class="toc-number">2.11.</span> <span class="toc-text">性能和资源管理</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#%E5%B9%B3%E5%8F%B0%E5%AE%89%E5%85%A8"><span class="toc-number">2.12.</span> <span class="toc-text">平台安全</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#%E5%85%B6%E4%BB%96"><span class="toc-number">2.13.</span> <span class="toc-text">其他</span></a></li></ol></li><li class="toc-item toc-level-2"><a class="toc-link" href="#clean-code"><span class="toc-number">3.</span> <span class="toc-text">clean code</span></a><ol class="toc-child"><li class="toc-item toc-level-3"><a class="toc-link" href="#%E8%BE%BE%E6%88%90clean-code"><span class="toc-number">3.1.</span> <span class="toc-text">达成clean code</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#%E8%BD%AF%E4%BB%B6%E9%87%8D%E6%9E%84"><span class="toc-number">3.2.</span> <span class="toc-text">软件重构</span></a></li></ol></li></ol>
    </nav>
  </div>
</aside>

<main class="main" role="main">
  <div class="content">
  <article id="post-编程规范" class="article article-type-post" itemscope itemtype="http://schema.org/BlogPosting">
    
    <div class="article-header">
      
        
  
    <h1 class="article-title" itemprop="name">
      编程规范
    </h1>
  

      
      <div class="article-meta">
        <span class="article-date">
    <i class="icon icon-calendar-check"></i>
	<a href="/Skyung/2022/03/29/%E7%BC%96%E7%A8%8B%E8%A7%84%E8%8C%83/" class="article-date">
	  <time datetime="2022-03-28T16:00:00.000Z" itemprop="datePublished">2022-03-29</time>
	</a>
</span>
        
  <span class="article-category">
    <i class="icon icon-folder"></i>
    <a class="article-category-link" href="/Skyung/categories/%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/">学习笔记</a>
  </span>

        
  <span class="article-tag">
    <i class="icon icon-tags"></i>
	<a class="article-tag-link-link" href="/Skyung/tags/java/" rel="tag">java</a>
  </span>


        

        <span class="post-comment"><i class="icon icon-comment"></i> <a href="/Skyung/2022/03/29/%E7%BC%96%E7%A8%8B%E8%A7%84%E8%8C%83/#comments" class="article-comment-link">评论</a></span>
        
      </div>
    </div>
    <div class="article-entry marked-body" itemprop="articleBody">
      
        <h2 id="代码风格"><a href="#代码风格" class="headerlink" title="代码风格"></a>代码风格</h2><h3 id="命名"><a href="#命名" class="headerlink" title="命名"></a>命名</h3><table>
<thead>
<tr>
<th>类别</th>
<th>命名风格</th>
</tr>
</thead>
<tbody><tr>
<td>接口、类、注解、枚举类</td>
<td>大驼峰，测试类加Test后缀</td>
</tr>
<tr>
<td>类的属性、局部变量、方法</td>
<td>小驼峰，测试方法可有下划线，方法可使用动词，集合加复数</td>
</tr>
<tr>
<td>静态常量、枚举值</td>
<td>大写字母和下划线</td>
</tr>
<tr>
<td>异常</td>
<td>加后缀Exception或Error</td>
</tr>
</tbody></table>
<h3 id="注释"><a href="#注释" class="headerlink" title="注释"></a>注释</h3><p>按需注释</p>
<ul>
<li>从读者的角度，按需注释</li>
<li>注释简洁明了</li>
<li>不要无效重复的注释</li>
<li>注释和代码修改同步</li>
</ul>
<p>JavaDoc</p>
<ul>
<li>要对public、protected修饰的元素添加javaDoc注释</li>
<li>顶层的public类的javaDoc应包含功能说明和创建日期版本信息</li>
<li>方法的javadoc包含功能说明，按照需要使用@param,@return等标签</li>
<li>不要添加空有格式的方法头注释</li>
<li>涉及线程安全时，要进行相关说明</li>
</ul>
<p>代码注释</p>
<ul>
<li>非首行的代码注释与前面的代码之间加一空行</li>
<li>代码右侧的注释，代码、注释符、注释之间留空格</li>
<li>正式交付的代码不要有TODO注释</li>
</ul>
<h3 id="格式"><a href="#格式" class="headerlink" title="格式"></a>格式</h3><p><img src="https://zqyhdm-blog.oss-cn-shanghai.aliyuncs.com/markdown/image-20220423144300124.png"></p>
<ul>
<li>java源文件按顺序包含版权、package、import、顶层类，其余用空行分隔</li>
<li>import按安卓、商业组织、其他开源第三方、net/org开源组织，java分类的顺序出现，并用空行分组</li>
<li>类按照类变量、静态初始代码块、实例变量、实例初始代码块、构造方法、方法的顺序排列，空行分隔</li>
<li>行宽建议不超过120字符，断点在符号前，逗号之后<ul>
<li>点分隔符</li>
<li>方法引用的两个冒号::</li>
<li>类型的限定符号&amp;</li>
<li>catch中的管道</li>
</ul>
</li>
</ul>
<h3 id="字面量"><a href="#字面量" class="headerlink" title="字面量"></a>字面量</h3><p>数字字面量设置合理的后缀指定数值类型</p>
<ul>
<li><p>float使用f F</p>
</li>
<li><p>double使用d D</p>
</li>
<li><p>long只能用L，避免l与数字1混淆</p>
</li>
</ul>
<h2 id="编程实践"><a href="#编程实践" class="headerlink" title="编程实践"></a>编程实践</h2><h3 id="申明和初始化、数据类型"><a href="#申明和初始化、数据类型" class="headerlink" title="申明和初始化、数据类型"></a>申明和初始化、数据类型</h3><p>局部变量、类的成员变量申明时，每行申明一个</p>
<ul>
<li>局部变量申明在首次使用的位置，最小化局部变量的范围</li>
<li>申明时不需要初始化为无效的null值</li>
<li>类的成员变量集中申明</li>
</ul>
<p>数组的申明不要C风格，String[] args 而不是String args[]</p>
<p>整数注意运算时的范围溢出</p>
<ul>
<li>为了防止溢出，可以使用Math.addExact()方法求和运算，当发生溢出时会抛出异常</li>
</ul>
<p>java浮点数不能产生精确的结果，注意精度的损失</p>
<ul>
<li>不要精确计算</li>
<li>不要进行等值判断，可设置一定的误差</li>
<li>不要把浮点数当作hashkey值</li>
<li>使用BIgDecimal，使用字符串格式的参数进行构造</li>
</ul>
<p>字符串</p>
<ul>
<li>换行符，文件路径分隔符在不同操作系统的自定义性<ul>
<li>System.lineSeparator()获取换行符</li>
<li>分隔符java.io.File中的separator</li>
</ul>
</li>
<li>字符串的乱码问题，地区问题。<ul>
<li>字符和字节的转换指定编码格式</li>
</ul>
</li>
<li>字符串的敏感数据及时清理<ul>
<li>主动将数据清零，Arrays.fill(password,(char)0x00)</li>
<li>优先使用char[]和byte[]</li>
</ul>
</li>
</ul>
<p>混合运算时要避免隐式的类型转换，容易精度损失</p>
<ul>
<li>比如int转float，long转double float</li>
</ul>
<h3 id="表达式、控制语句、方法"><a href="#表达式、控制语句、方法" class="headerlink" title="表达式、控制语句、方法"></a>表达式、控制语句、方法</h3><p>明确使用括号防止默认的优先级与设计思想不符</p>
<p>禁止使用直接为null的对象，应该在代码中预检查而不是处理异常</p>
<p>代码中不使用断言assert</p>
<p>避免分支结构的遗漏处理，要添加一个兜底的逻辑</p>
<ul>
<li>对于多个else if语句，最后添加else分支，可以简单抛出异常</li>
<li>对于switch添加default</li>
</ul>
<p>方法是可组合，可重用的最小单位，编写高内聚低耦合的方法</p>
<ul>
<li>方法不要过长，复杂方法意味着功能不单一</li>
<li>方法的参数不建议超过5个<ul>
<li>可将相关参数定义为类</li>
<li>构造参数过多时，考虑用builder模式或工厂模式</li>
</ul>
</li>
<li>方法最大代码嵌套深入不要超过4层</li>
</ul>
<p>方法的返回值不返回null</p>
<ul>
<li><p>用长度为0的数组，为空的集合代替null</p>
</li>
<li><p>使用Optional代替null</p>
<figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">public</span> User <span class="title function_">get</span><span class="params">(Integer id)</span>&#123;</span><br><span class="line">  <span class="comment">//从数据库中通过id直接获取实体对象</span></span><br><span class="line">  <span class="keyword">return</span> Optional.ofNullable(userService.get(id)).orElseGet(()-&gt;<span class="keyword">new</span> <span class="title class_">User</span>());</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></li>
<li><p>使用OptionalInt、OptionalIong代替Optional<Integer></p>
</li>
<li><p>Optional,of()参数不能为null</p>
</li>
</ul>
<h3 id="类、接口、面向对象"><a href="#类、接口、面向对象" class="headerlink" title="类、接口、面向对象"></a>类、接口、面向对象</h3><p>类</p>
<ul>
<li>设置最小的可访问性</li>
<li>类中避免public且非final的属性</li>
<li>匿名内部类用lambda表达式或方法引用替代</li>
<li>覆写equals的同时覆写hashCode</li>
<li>不要在父类的构造方法中调用可能被子类重写的方法，子类在构造时容易出问题</li>
</ul>
<p>接口</p>
<ul>
<li>接口的属性默认public static final，不需要多余的修饰词</li>
<li>接口的方法默认public abstract，不需要多余的修饰词</li>
</ul>
<h3 id="异常处理"><a href="#异常处理" class="headerlink" title="异常处理"></a>异常处理</h3><p>异常不要作为流程控制和条件控制</p>
<p>异常尽量预检，不应该try catch机制处理，比如指针</p>
<p>不要用通过空的catch块忽略异常</p>
<p>多类异常用同一个逻辑处理时，用并语法catch（Exceptiontype1 | Exceptiontype12)</p>
<p>抛出的异常可能包含敏感数据，敏感数据保护问题</p>
<ul>
<li>比如可限定文件的访问范围，异常后只返回简要信息</li>
</ul>
<p><img src="https://zqyhdm-blog.oss-cn-shanghai.aliyuncs.com/markdown/image-20220423164034617.png" alt="image-20220423164034617"></p>
<p>在catch中抛出新异常时，避免丢失原始异常的信息</p>
<p><img src="https://zqyhdm-blog.oss-cn-shanghai.aliyuncs.com/markdown/image-20220423164301935.png" alt="image-20220423164301935"></p>
<h3 id="并发与多线程"><a href="#并发与多线程" class="headerlink" title="并发与多线程"></a>并发与多线程</h3><p>部分锁使用不当的操作</p>
<ul>
<li>使用高层并发对象的内置锁进行同步</li>
<li>使用实例同步静态共享变量</li>
<li>使用可重用的对象同步，比如字符串</li>
<li>使用getClass()返回的类对象同步，在存在类继承时容易出问题</li>
</ul>
<p>避免单例不正确的双重检查，添加volatile</p>
<p>线程api</p>
<ul>
<li>创建线程指定名称</li>
<li>注册Thread对象的异常处理handler</li>
<li>不依赖线程调度器、线程优先级和yield()方法</li>
<li>使用合理的方法中断线程</li>
</ul>
<p>线程池中的任务结束后必须清理自定义的ThreadLocal变量 threadLocal.remove()</p>
<p>尽量减小锁的范围</p>
<p>高并发场景，为防止==判断被击穿，尽量使用&gt;=判断</p>
<ul>
<li>某营销活动发奖，判断剩余奖品数量等于0时，终止发放奖品，但因为并发处理错误导致奖品数量瞬间变成了负数</li>
</ul>
<h3 id="泛型和集合"><a href="#泛型和集合" class="headerlink" title="泛型和集合"></a>泛型和集合</h3><ul>
<li><p>尽量使用泛型，静态方法无法访问类上定义的泛型，必须定义为泛型方法</p>
</li>
<li><p>集合优先使用泛型，不推荐使用泛型数组</p>
</li>
<li><p>Collector.toMap()避免相同key的异常，避免value为null的异常</p>
</li>
<li><p>Arrays.asList()将数组转为集合为，生成的集合不支持添加删除，对数组或集合中的元素进行修改，会导致对方的同步修改</p>
</li>
<li><p>Collections类可以生成immutable的Set、List、 Map,对于这些集合不能进行添加/删除元素操作。</p>
</li>
<li><p>调用List的subList()方法生成的子List,与原List存在关联关系: 对于任一-list的修改都可能会导致另-方同步修改;对原List的</p>
</li>
<li><p>增删操作可能会导致对子List操作时抛出ConcurrentModificationException.</p>
</li>
<li><p>集合的addAll)方法如果入参为null会抛出NullPointerException,应保证传入的集合不为null。</p>
</li>
</ul>
<h3 id="输入输出"><a href="#输入输出" class="headerlink" title="输入输出"></a>输入输出</h3><p>目录遍历攻击</p>
<ul>
<li>由于应用程序未对外部输入的文件名或路径做有效地验证与清理，攻击者通过输入包含上一层目录”符号(如Windows中的”..&quot; 与Unix中的”../.” )的文件路径，导航访问到服务器上的受限目录与文件。另外，也可以通过在文件名后追加\0.jpg等伪造符合校验规则的文件后缀来绕过安全检查。</li>
<li>使用不可信数据构造文件路径时，必须对不可信数据进行严格校验、过滤</li>
<li>使用不可信数据构造的文件路径，使用前必须对进行安全检查，且安全检查前，必须对文件路径进行标准化<br>处理。标准化处理的函数必须使用getCanonicalPath(), 禁止使用getAbsolutePath()</li>
</ul>
<p>zip文件解压</p>
<p>使用java.util.zip.ZipInputStream解压zip文件时，有两个安全风险需要注意</p>
<ul>
<li>文件解压到目标路径之外（注入../）</li>
<li>解压文件消耗过多的系统资源</li>
</ul>
<p>在进行zip文件解压时，调用sanitzeFileName()函数检查文件名称中是否存在路径遍历类问题，然后边读边统计实际解压文件大小及文件数量，保证zip解压不消耗过多的系统资源。当然，解压操作要保证文件的格式是zip文件。</p>
<p>临时文件使用完毕必须及时删除</p>
<h3 id="序列化"><a href="#序列化" class="headerlink" title="序列化"></a>序列化</h3><p>禁止直接序列化指向系统资源的信息</p>
<p>不安全的反序列化</p>
<ul>
<li><p>对调用jdk的API进行反序列化操作时，要自定义ObjectInputStream类，对resolveClass()方法进行重载， 在该方法中使用白名单的方式对目标class进行白名单检查</p>
<p><img src="https://zqyhdm-blog.oss-cn-shanghai.aliyuncs.com/markdown/image-20220423201441336.png" alt="image-20220423201441336"></p>
</li>
<li><p>json格式的不安全反序列化</p>
<p>对于json数据的反序列化操作，一般调用三方件(如fastjson/jackson等) 实现，这些三方件都有autoType功能(通过@type关键字指定反序列化的目标类) , 方便java对象与json数据的转换，这也导致漏洞的产生。</p>
</li>
<li><p>XML格式的不安全反序列化</p>
<p>对于xml数据的反序列化，常用的是三方件Xstream和java原生的XMLDecoder; 推荐使用Xstream组件，因为<br>XMLDecoder未提供任何针对不安全反序列化的安全防护措施。</p>
</li>
</ul>
<h3 id="外部数据校验"><a href="#外部数据校验" class="headerlink" title="外部数据校验"></a>外部数据校验</h3><p>总体原则：所有的外部数据使用前都要进行合法性校验</p>
<p>外部数据校验的步骤：</p>
<p><img src="https://zqyhdm-blog.oss-cn-shanghai.aliyuncs.com/markdown/image-20220423202156407.png" alt="image-20220423202156407"></p>
<p>外部数据的校验是要与实际应用场景相结合的: </p>
<ul>
<li>对于常见的SQL注入、OS注入，可以通过白名单校验，确保只含字母、数字，这样一般不会产生注入风险。</li>
<li>对于从配置文件中读取了一一个没有范围限制的文件路径，这样的操作一 般就无法通过输入校验来保证安全，需要结合其他措施消减安全风险。</li>
<li>另外，对于外部数据的修改要在校验前完成，保证实际使用的数据与通过校验的数据是一致的。</li>
</ul>
<p>OS命令注入</p>
<ul>
<li>系统使用外部输入来构造OS命令时，由于未对可能与期望执行OS命令不一致的输入进行清理， 或过滤处理不当，攻击者可能会利用此漏洞执行攻击者没有权限执行的、系统所不期望的危险命令。</li>
</ul>
<p>XML文件使用的相关风险</p>
<ul>
<li>使用不可信数据构造XML数据导致xml注入</li>
<li>解析不可信xml文件时，导致XXE漏洞或内部实体扩展攻击</li>
<li>xml文件格式转换时，使用不安全的xslt导致任意代码执行</li>
<li>使用白名单检验禁止输入特殊字符</li>
<li>使用安全的xml库</li>
<li>对不可信数据转码</li>
</ul>
<p>不安全的XSLT转换xml问题</p>
<p>正则注入攻击</p>
<p>ReDos正则表达式拒绝服务攻击</p>
<p>不安全反射</p>
<ul>
<li>反射操作中直接使用外部数据作为类名或方法名</li>
</ul>
<h3 id="日志"><a href="#日志" class="headerlink" title="日志"></a>日志</h3><p>相对于控制台打印，Facade模式的日志框架 (如第三方slf4j、 产品自研日志框架等)提供了更丰富的日志记录功能，且使用更加简单，产品实际输出日志时应该使用这些日志框架。</p>
<p>日志输出时，应该分等级。日志的级别一般分为: trace (有的也叫verbose)、debug、 info、 warning、 error、 fatal。</p>
<p>推荐与具体实现有关的日志记录trace或debug级，一般的业务处理日志用info级，不影响业务进行的错误用warning级，例如用户输入参数错误。而error或fatal级， 只记录系统逻辑出错、异常或者重要的错误信息，常常向运维系统报警。</p>
<p>建议生产环境不输出trace或debug日志;有选择地输出info日志;输出warning、 error、 fatal旧志。</p>
<p>对于info及以下级别的日志，生产环境下可能不需要输出这些日志，对于这样的日志输出，应该<strong>使用条件形式或占位符的方式</strong>（而不是直接的字符串拼接），避免日志内容的无效构建。</p>
<ul>
<li>日志注入:不可信数据没有经过校验或过滤直接记录到日志中，导致日志被伪造，或日志中记录<br>隐私/敏感数据。</li>
<li>日志中记录明文的口令、秘钥等敏感信息时，会导致敏感信息泄露风险。对于口令、秘钥等敏感信息，不管是明文还是加密密文都不能直接记录日志，如果需要记录日志需要使用固定长度的*替代这些敏感信息；对于其他类敏感信息(如手机号、邮箱等)，可以先进行匿名化处理后再记录日志。常见敏感信息匿名化处理如下表所示。</li>
</ul>
<p><img src="https://zqyhdm-blog.oss-cn-shanghai.aliyuncs.com/markdown/image-20220424104650459.png" alt="image-20220424104650459"></p>
<h3 id="性能和资源管理"><a href="#性能和资源管理" class="headerlink" title="性能和资源管理"></a>性能和资源管理</h3><p>提升数组操作的性能</p>
<p>将集合转为数组时，推荐使用Collection <T> .toArray(T[])，参数应采用零长度的数组。这样可以避免创建临<br>时数组，节省空间，还可以保证最好的性能。</p>
<p>对于数组的复制，推荐使用System.arraycopy()或Arrays.copyOf0h 其数组复制的特性如下:</p>
<ul>
<li>对于一维数组，且数组元素为基本类型或String类型时，数组复制属于深复制，即复制后的数组与原始数<br>组的元素互不影响;</li>
<li>对于多维数组，或一维数组中的元素是引用类型时，数组复制属于浅复制，即复制后的数组与原始数组的<br>元素引用指向的是同一个对象。</li>
</ul>
<p>集合初始化时，如果可预估集合的元素数量，应指定初始化大小</p>
<ul>
<li>集合的扩容操作比较耗费资源，有性能损耗。尤其是集合需要添加大量元素时，可能会触发多次扩容。所以对于可以预估集合中的实际元素数量时，应该在集合初始化时，合理设置集合的容量，避免集合的自动扩<br>容。</li>
</ul>
<p>避免正则表达式的重复预编译</p>
<ul>
<li>对于正则表达式被频繁重复使用的场景，应该提前对正则表达式进行预编译，提升程序的执行效率。</li>
<li>除了直接使用正则表达式外，JDK中的很多API也会直接接受字符串格式的正则表达式，如String.replaceAll()、String.split()等，如果对于这些API需要频繁重复调用，也应该考虑使用正则来直接处理，提升效率。</li>
</ul>
<p>避免创建不必要的对象</p>
<ul>
<li>避免new string()，使用String str = “”</li>
<li>避免new Integer()，使用Integer.valueof()</li>
<li>不要创建临时变量作为return返回值</li>
</ul>
<p>在try-with-resource或finally里释放I0类资源</p>
<p>禁止主动使用GC或使用finalize()方法</p>
<h3 id="平台安全"><a href="#平台安全" class="headerlink" title="平台安全"></a>平台安全</h3><p>java平台安全机制和组件</p>
<ul>
<li>ByteCode Verifier:字节码验证器，负责对Class文件的合法性与有效性进行检查</li>
<li>ClassLoader:类加载器，负责类加载、命名空间隔离、系统类保护、访问权限分配</li>
<li>SecurityManager:安全管理器,负责运行时代码访问控制执行，用于指明代码是否可以访问指定的资源</li>
<li>AccessController:访问控制器，提供-个默认的安全策略执行机制，它使用栈检查来决定潜在不安全的操作是否被允许</li>
<li>Policy:策略文件，根据代码的来源和其签名者来为其指定不同的权限</li>
</ul>
<p>安全检查相关的方法必须声明为private或final,</p>
<ul>
<li>实现安全检查功能(主要是指调用SecurityManager执行的安全检查)的方法，如果可以被子类覆写，恶意子类可以覆写安全检查方法，忽略这些安全检查，使安全检查失效。所以安全检查相关的方法必须声明为private或final,防止被子类覆写。</li>
</ul>
<p>编写自定义类加载器时必须调用超类的getPermission()函数</p>
<ul>
<li>当一个自定义的类装载器要覆写getPermissions()方法的时候，必须要在给源代码赋予任何权限之前先调用基类的getPermissions方法来获取默认的系统规则。-个忽略了基类的getPermissions()方法的自定义类装载器会载入被提升了权限的非受信的类。</li>
</ul>
<h3 id="其他"><a href="#其他" class="headerlink" title="其他"></a>其他</h3><p>密码学意义上的安全随机数</p>
<ul>
<li>伪随机数易被攻击者破解而找到其生成规律，伪随机数不能用于安全敏感应用</li>
</ul>
<p>传递敏感信息时应该使用SSLSocket</p>
<ul>
<li>当需要传输敏感数据时，程序必须使用javax.net.ssl.SSLSocket类， 而不能用java.net.Socket. SSLSocket类提供 了诸如SSL/TLS等安全协议来保证通道不被监听和恶意篡改的影响。</li>
</ul>
<p>不再使用的代码应直接删除，不要注释掉</p>
<ul>
<li>被注释掉的代码，无法被正常维护;当企图恢复使用这段代码时，极有可能引入易被忽略的缺陷; 不用的import语句，增加了代码的耦合度，不利于维护，应该直接删除。不需要代码应该直接删除;如需要重新引入，可以重写相关的代码。</li>
</ul>
<p>代码中禁止包含公网地址</p>
<h2 id="clean-code"><a href="#clean-code" class="headerlink" title="clean code"></a>clean code</h2><ul>
<li><p>简洁可读：易于阅读，易于实现，恰到好处</p>
</li>
<li><p>可维护：软件可修改、可扩展可复用的能力（高内聚低耦合）</p>
</li>
<li><p>代码可测试：可隔离、可控制、可观测、可定位（TDD是保证可测试性的较好手段）</p>
</li>
<li><p>代码可靠：预防、容错、自愈（与资源、通信、状态、业务流程、数据规模等因素有关）</p>
</li>
<li><p>代码高效：尽量减少使用系统资源，CPU、内存、硬盘、网络带宽</p>
</li>
<li><p>代码可移植：适应不同环境的能力，CPU、编译器、操作系统、软硬件平台与环境</p>
</li>
<li><p>代码安全：软件面对威胁的防护能力,并能保持系统信息的机密性、完整性和可用性，未授权访问/使用、泄露、破坏、篡改、毁灭等（减少代码攻击面，输入校验与转义、采取防御性编程策略）</p>
</li>
</ul>
<p>不同系统对Clean Code不同维度的要求不一样,一般可以从以下优先级来权衡:</p>
<p>安全&gt;可靠&gt;可读&gt;可维护&gt;可测试&gt;高效&gt;可移植</p>
<p>个别场景下,不同维度之间可能还会存在冲突</p>
<ul>
<li>有些热点函数要进行性能优化，必然破坏可读性，但是此类函数不多， 性能又必须达标，只能权衡牺牲少部分函数的可读性。</li>
<li>安全编码所要求的防御式编程一定程度上影响可读性、性能，但是一旦产生安全问题，造成的后果很严重，所以经过权衡防御式编程的优先级更高。</li>
<li>编码中适当使用多态、多线程、中断、异常、函数指针等可以提升代码的可修改/可扩展性，但过度使用会导致可读性严重下降，调试也非常困难。</li>
</ul>
<h3 id="达成clean-code"><a href="#达成clean-code" class="headerlink" title="达成clean code"></a>达成clean code</h3><p>设计与TDD</p>
<p>代码重构</p>
<p>工具检查</p>
<p>专家评审</p>
<p>代码安全&gt;代码整洁&gt;代码架构敏捷</p>
<h3 id="软件重构"><a href="#软件重构" class="headerlink" title="软件重构"></a>软件重构</h3><p>所谓重构(refactoring) 是这样一个过程:在不改变代码外在行为的前提下，对代码做出修改，以改进程序的内部结构。</p>
<p>为什么要重构，存量产品问题:</p>
<ul>
<li>难以添加新特性:添加1行代码都需要阅读理解相关的几千行代码</li>
<li>存量代码难以理解:培训和维护都异常困难，新员工成长缓慢，某些代码完全依赖于特定的一位老员工，人员依赖风险极大</li>
<li>难以保证产品质量: 缺乏有效的自动化测试，添加或修改1行代码都必须手工执行所有的测试用例</li>
<li>接口混乱:文档缺失、模块内外耦合严重，典型表现为头文件混乱</li>
<li>简单堆砌式实现(垂直烟囱式) :各种全局性的控制变量多,并且不断的异常性增加</li>
<li>系统资源不足:内存、CPU、 Flash空间等不足的问题开始不断显现</li>
<li>员工工作疲惫:相似的任务、重复的代码、不断增加的工作量，使得员工疲惫不堪</li>
</ul>
<p>重构的分类</p>
<ul>
<li><p>小颗粒度重构（函数级、小模块级）</p>
</li>
<li><p>大颗粒重构（架构级、大模块级）</p>
</li>
</ul>
<p>何时重构</p>
<p>重构应该随时随地进行，不应该为了重构而重构。</p>
<ul>
<li><p>三次法则:事不过三，三则重构</p>
<p>第一次做某件事时只管去做;第二次做类似的事会产生反感，但无论如何还是做了第三次再做类似的事,你就应该重构</p>
</li>
<li><p>重构时机</p>
<p>添加功能时:让未来增加新特性时更快速、更流畅</p>
<p>修补错误时:因代码不够清晰而无法一目了然地发现错误</p>
<p>复审代码时:经验传递，改善设计</p>
</li>
</ul>
<p>如何重构</p>
<ul>
<li><p>两顶帽子:「添加新功能」和「重构」</p>
<p>添加新功能时，你不应该修改既有代码，只管添加新功能</p>
<p>重构时,你就不能再添加功能，只管改进程序结构</p>
</li>
<li><p>一次只做一件事</p>
</li>
</ul>

      
    </div>
    <div class="article-footer">
      <blockquote class="mt-2x">
  <ul class="post-copyright list-unstyled">
    
    <li class="post-copyright-link hidden-xs">
      <strong>本文链接：</strong>
      <a href="https://skyung.gitee.io/Skyung/2022/03/29/%E7%BC%96%E7%A8%8B%E8%A7%84%E8%8C%83/" title="编程规范" target="_blank" rel="external">https://skyung.gitee.io/Skyung/2022/03/29/编程规范/</a>
    </li>
    
    <li class="post-copyright-license">
      <strong>版权声明： </strong> 本博客所有文章除特别声明外，均采用 <a href="http://creativecommons.org/licenses/by/4.0/deed.zh" target="_blank" rel="external">CC BY 4.0 CN协议</a> 许可协议。转载请注明出处！
    </li>
  </ul>
</blockquote>


<div class="panel panel-default panel-badger">
  <div class="panel-body">
    <figure class="media">
      <div class="media-left">
        <a href="https://github.com/cofess" target="_blank" class="img-burn thumb-sm visible-lg">
          <img src="/Skyung/images/avatar.jpg" class="img-rounded w-full" alt="">
        </a>
      </div>
      <div class="media-body">
        <h3 class="media-heading"><a href="https://github.com/cofess" target="_blank"><span class="text-dark">Skyung</span><small class="ml-1x">Web Developer</small></a></h3>
        <div>脚踏实地，仰望星空</div>
      </div>
    </figure>
  </div>
</div>


    </div>
  </article>
  
    
  <section id="comments">
  	
      <div id="uyan_frame"></div>
    
  </section>


  
</div>

  <nav class="bar bar-footer clearfix" data-stick-bottom>
  <div class="bar-inner">
  
  <ul class="pager pull-left">
    
    <li class="prev">
      <a href="/Skyung/2022/03/29/java8%E6%96%B0%E7%89%B9%E6%80%A7/" title="java8新特性"><i class="icon icon-angle-left" aria-hidden="true"></i><span>&nbsp;&nbsp;上一篇</span></a>
    </li>
    
    
    <li class="next">
      <a href="/Skyung/2022/03/01/java%E7%BA%BF%E7%A8%8B%E6%B1%A0/" title="java线程池"><span>下一篇&nbsp;&nbsp;</span><i class="icon icon-angle-right" aria-hidden="true"></i></a>
    </li>
    
    
    <li class="toggle-toc">
      <a class="toggle-btn " data-toggle="collapse" href="#collapseToc" aria-expanded="false" title="文章目录" role="button">    <span>[&nbsp;</span><span>文章目录</span>
        <i class="text-collapsed icon icon-anchor"></i>
        <i class="text-in icon icon-close"></i>
        <span>]</span>
      </a>
    </li>
    
  </ul>
  
  
  <!-- Button trigger modal -->
  <button type="button" class="btn btn-fancy btn-donate pop-onhover bg-gradient-warning" data-toggle="modal" data-target="#donateModal"><span>赏</span></button>
  <!-- <div class="wave-icon wave-icon-danger btn-donate" data-toggle="modal" data-target="#donateModal">
    <div class="wave-circle"><span class="icon"><i class="icon icon-bill"></i></span></div>
  </div> -->
  
  
  <div class="bar-right">
    
    <div class="share-component" data-sites="weibo,qq,wechat,facebook,twitter" data-mobile-sites="weibo,qq,qzone"></div>
    
  </div>
  </div>
</nav>
  
<!-- Modal -->
<div class="modal modal-center modal-small modal-xs-full fade" id="donateModal" tabindex="-1" role="dialog">
  <div class="modal-dialog" role="document">
    <div class="modal-content donate">
      <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
      <div class="modal-body">
        <div class="donate-box">
          <div class="donate-head">
            <p>感谢您的支持，我会继续努力的!</p>
          </div>
          <div class="tab-content">
            <div role="tabpanel" class="tab-pane fade active in" id="alipay">
              <div class="donate-payimg">
                <img src="/Skyung/images/donate/alipay.jpg" alt="扫码支持" title="扫一扫" />
              </div>
              <p class="text-muted mv">扫码打赏，你说多少就多少</p>
              <p class="text-grey">打开支付宝扫一扫，即可进行扫码打赏哦</p>
            </div>
            <div role="tabpanel" class="tab-pane fade" id="wechatpay">
              <div class="donate-payimg">
                <img src="/Skyung/images/donate/wechat.jpg" alt="扫码支持" title="扫一扫" />
              </div>
              <p class="text-muted mv">扫码打赏，你说多少就多少</p>
              <p class="text-grey">打开微信扫一扫，即可进行扫码打赏哦</p>
            </div>
          </div>
          <div class="donate-footer">
            <ul class="nav nav-tabs nav-justified" role="tablist">
              <li role="presentation" class="active">
                <a href="#alipay" id="alipay-tab" role="tab" data-toggle="tab" aria-controls="alipay" aria-expanded="true"><i class="icon icon-alipay"></i> 支付宝</a>
              </li>
              <li role="presentation" class="">
                <a href="#wechatpay" role="tab" id="wechatpay-tab" data-toggle="tab" aria-controls="wechatpay" aria-expanded="false"><i class="icon icon-wepay"></i> 微信支付</a>
              </li>
            </ul>
          </div>
        </div>
      </div>
    </div>
  </div>
</div>



</main>

  <footer class="footer" itemscope itemtype="http://schema.org/WPFooter">
	
	
    <ul class="social-links">
    	
        <li><a href="/Skyung/null" target="_blank" title="Github" data-toggle=tooltip data-placement=top><i class="icon icon-github"></i></a></li>
        
        <li><a href="/Skyung/null" target="_blank" title="Weibo" data-toggle=tooltip data-placement=top><i class="icon icon-weibo"></i></a></li>
        
        <li><a href="/Skyung/null" target="_blank" title="Twitter" data-toggle=tooltip data-placement=top><i class="icon icon-twitter"></i></a></li>
        
        <li><a href="/Skyung/null" target="_blank" title="Behance" data-toggle=tooltip data-placement=top><i class="icon icon-behance"></i></a></li>
        
        <li><a href="/Skyung/atom.xml" target="_blank" title="Rss" data-toggle=tooltip data-placement=top><i class="icon icon-rss"></i></a></li>
        
    </ul>

    <div class="copyright">
    	
        <div class="publishby">
        	Theme by <a href="https://github.com/cofess" target="_blank"> cofess </a>base on <a href="https://github.com/cofess/hexo-theme-pure" target="_blank">pure</a>.
        </div>
    </div>
</footer>
  <script src="//cdn.jsdelivr.net/npm/jquery@1.12.4/dist/jquery.min.js"></script>
<script>
window.jQuery || document.write('<script src="js/jquery.min.js"><\/script>')
</script>

<script src="/Skyung/js/plugin.min.js"></script>


<script src="/Skyung/js/application.js"></script>


    <script>
(function (window) {
    var INSIGHT_CONFIG = {
        TRANSLATION: {
            POSTS: '文章',
            PAGES: '页面',
            CATEGORIES: '分类',
            TAGS: '标签',
            UNTITLED: '(未命名)',
        },
        ROOT_URL: '/Skyung/',
        CONTENT_URL: '/Skyung/content.json',
    };
    window.INSIGHT_CONFIG = INSIGHT_CONFIG;
})(window);
</script>

<script src="/Skyung/js/insight.js"></script>






   




   
    
    <script defer type="text/javascript" src="http://v2.uyan.cc/code/uyan.js?uid=[object Object]"></script>








</body>
</html>